perm filename TRIANG.PSC[1,DEK] blob sn#872695 filedate 1989-04-27 generic text, type T, neo UTF8
{3:}{6:}{$C+,A+,D+}{:6}PROGRAM TRIANG(DATAFILE);LABEL{5:}9999;{:5}
CONST{4:}BUFSIZE=80;MAXN=100;{:4}TYPE{10:}TEXTFILE=PACKED FILE OF CHAR;
{:10}VAR{11:}DATAFILE:TEXTFILE;{:11}{12:}N:INTEGER;
X,Y:ARRAY[1..MAXN]OF INTEGER;A,B,XX,YY:INTEGER;{:12}{17:}
LHS:ARRAY[1..MAXN]OF BOOLEAN;SORTED:ARRAY[1..MAXN]OF INTEGER;{:17}{22:}
H:INTEGER;{:22}{27:}ACCN,ACCD:INTEGER;D:INTEGER;ACC:REAL;{:27}{15:}
FUNCTION CCW(A,B,C:INTEGER):BOOLEAN;VAR D:INTEGER;
BEGIN D:=(X[A]-X[C])*(Y[B]-Y[C])-(X[B]-X[C])*(Y[A]-Y[C]);
IF D=0 THEN WRITE(TTY,'Points ',CHR(A+64),CHR(B+64),CHR(C+64),
' are collinear!')ELSE CCW:=(D>0);END;{:15}{16:}
FUNCTION INCIRC(A,B,C,D:INTEGER):BOOLEAN;
VAR T,T11,T12,T13,T21,T22,T23,T31,T32,T33:INTEGER;BEGIN T11:=X[A]-X[D];
T12:=Y[A]-Y[D];T13:=T11*T11+T12*T12;T21:=X[B]-X[D];T22:=Y[B]-Y[D];
T23:=T21*T21+T22*T22;T31:=X[C]-X[D];T32:=Y[C]-Y[D];T33:=T31*T31+T32*T32;
T:=T11*T22*T33+T12*T23*T31+T13*T21*T32-(T31*T22*T13+T32*T23*T11+T33*T21*
T12);
IF T=0 THEN WRITE(TTY,'Points ',CHR(A+64),CHR(B+64),CHR(C+64),CHR(D+64),
' are cocircular!')ELSE INCIRC:=(T>0);END;{:16}{18:}
PROCEDURE SORT(XX,YY:INTEGER);LABEL 30,45;VAR A,B,J,M:INTEGER;
BEGIN M:=0;
FOR A:=1 TO N DO IF A<>XX THEN IF A<>YY THEN BEGIN LHS[A]:=CCW(A,XX,YY);
{19:}J:=M;WHILE J>0 DO BEGIN B:=SORTED[J];{20:}
IF LHS[A]THEN IF LHS[B]THEN IF INCIRC(A,XX,YY,B)THEN GOTO 45 ELSE GOTO
30 ELSE IF INCIRC(B,XX,YY,A)THEN GOTO 45 ELSE GOTO 30 ELSE IF LHS[B]THEN
IF INCIRC(B,XX,YY,A)THEN GOTO 45 ELSE GOTO 30 ELSE IF INCIRC(A,XX,YY,B)
THEN GOTO 45 ELSE GOTO 30;45:{:20};SORTED[J+1]:=B;J:=J-1;END;
30:SORTED[J+1]:=A;M:=M+1{:19};END;END;{:18}{23:}
FUNCTION GCD(M,N:INTEGER):INTEGER;VAR R:INTEGER;
BEGIN WHILE N>0 DO BEGIN R:=M MOD N;M:=N;N:=R;END;GCD:=M;END;
PROCEDURE ADD(NUM,DEN:INTEGER);VAR D1,T,D2:INTEGER;
BEGIN D1:=GCD(NUM,DEN);ACCD:=ACCD DIV D1;T:=ACCN*(DEN DIV D1)+NUM*ACCD;
D2:=GCD(T,D1);ACCN:=T DIV D2;ACCD:=ACCD*(DEN DIV D2);END;{:23}BEGIN{28:}
{13:}RESET(DATAFILE);READLN(DATAFILE,N);
FOR A:=1 TO N DO READLN(DATAFILE,X[A],Y[A]){:13};
FOR XX:=1 TO N-1 DO FOR YY:=XX+1 TO N DO BEGIN WRITE(TTY,CHR(XX+64),CHR(
YY+64),':');SORT(XX,YY);{21:}H:=0;
FOR A:=1 TO N-2 DO IF LHS[SORTED[A]]THEN BEGIN WRITE(TTY,' ',CHR(SORTED[
A]+64),A:1);H:=H+1;END;WRITE(TTY,' |');
FOR A:=1 TO N-2 DO IF NOT LHS[SORTED[A]]THEN WRITE(TTY,' ',CHR(SORTED[A]
+64),A:1){:21};{25:}{ACCN:=1;ACCD:=((H+1)*(H+2))DIV 2;
FOR A:=1 TO N-2 DO IF LHS[SORTED[A]]THEN BEGIN H:=H-1;
[26:]D:=(((H+1)*(H+2))DIV 2)*(H+3);
IF D MOD 2=0 THEN ADD(1,D DIV 2)ELSE ADD(2,D)[:26];END ELSE H:=H+1;
WRITE(TTY,' Pr = ',ACCN:1,'/',ACCD:1,' =',ACCN/ACCD:7:5)}
ACC:=2/((H+1)*(H+2));
FOR A:=1 TO N-2 DO IF LHS[SORTED[A]]THEN BEGIN H:=H-1;
ACC:=ACC+4/((H+1)*(H+2)*(H+3));END ELSE H:=H+1;
WRITE(TTY,' Pr = ',ACC:7:5){:25};WRITELN(TTY,'');END{:28};END.{:3}